class Privado(db.Model):
    autor = db.ReferenceProperty(reference_class=Usuario, collection_name='privado_autor', required=True)
    destinatario = db.ReferenceProperty(reference_class=Usuario, collection_name='privado_destinatario', required=True)
    fecha = db.DateTimeProperty(required=True, auto_now_add=True)
    leido = db.BooleanProperty(required=True, default=False)
    texto = db.TextProperty(required=True)
    
    @classmethod
    def enviar_privado(cls, id_autor, id_destinatario, texto):
        '''
        El metodo inserta un nuevo privado en la base de datos. Comprueba las
        condiciones:
        1) El usuario autor existe. (Error motivo 2)
        2) El usuario destinatario existe (Error motivo 1)
        No se realizan cambios en el texto. Si se quiere escapar o realizar
        cambios, deberá hacerse en el controlador.
        '''
        u_autor = Usuario.buscar_por_nombre(id_autor)
        u_destinatario = Usuario.buscar_por_nombre(id_destinatario)
        if u_autor:
            if u_destinatario:
                p = Privado(autor=u_autor.key(), destinatario=u_destinatario.key(), texto=texto)
                p.put()
                return {'exito' : True}
            else:
                return {'exito' : False, 'motivo' : 1}
        else:
            return {'exito' : False, 'motivo' : 2}
        
    
    @classmethod
    def listar_privados(cls, usuario):
        '''
        Lista la bandeja de entrada del usuario introducido.
        Si se usa el atributo num_pag (es mayor de cero) solo se listarán una
        cantidad, dejando las demás.
        Si el usuario no existe deuelve None.
        Si pag es mayor que cero, pero per_pag es menor o igual a cero,
        la busqueda se hara sin paginacion
        '''
        u = Usuario.buscar_por_nombre(usuario)
        if u:
            #if fecha and per_pag > 0:
            #   cls.all().filter('autor =', u.key()).order("-fecha").filter('fecha <=', inicio).fetch(per_pag + 1)
                
            #else:
                return cls.all().filter('autor =', u.key()).order("-fecha").run()
    
    def marcar_como_leido(self):
        '''
        Marca un mensaje privado como leido y lo guarda en el datastore
        '''
        self.leido(True)
        self.put()
        
    def marcar_como_no_leido(self):
        '''
        Marca un mensaje privado como no leido y lo guarda en el datastore
        '''
        self.leido(False)
        self.put()
